package com.反射Reflection.API;

import java.lang.reflect.Method;
@SuppressWarnings("all")
public class API3 {

    /// 反射访问方法
    /// 1.得到方法对象    Class类对象.getDeclaredMethod(方法名，参数类型列表)
    /// 2.调用方法       方法对象.invoke(实例，参数列表)  如果方法是static 实例可以是null
    public static void main(String[] args) throws Exception {
        /// 1.反射加载类创建对象
        Class<?> cls = Class.forName("com.反射Reflection.Reflection___.Methods");
        Object o = cls.getDeclaredConstructor().newInstance();

        /// 得到名字为m1 无参的方法 并调用，如果是非Public的就得爆破
        Method m1 = cls.getDeclaredMethod("m1");
        m1.invoke(o);

        /// 得到名字为m2 参数类型是String的方法 并调用，
        Method m2 = cls.getDeclaredMethod("m2", String.class);
        m2.invoke(o, "hello");

        /// 得到名字为m3 参数类型是String int char 的方法 并调用，
        Method m3 = cls.getDeclaredMethod("m3", String.class, int.class, char.class);
        m3.setAccessible(true);  //因为是私有的，爆破
        m3.invoke(o, "haha", 28, '男');

        /// 得到名字为m4 无参的方法 并调用，
        Method m4 = cls.getDeclaredMethod("m4");
        m4.setAccessible(true);  //因为是私有的，爆破
        m4.invoke(null);  ///这里是因为m4方法是静态的传入对象可以是null，也可以是实例对象     m4.invoke(o);


    }
}

class Methods {
    public int m1() {
        System.out.println("调用到了 public int m1() ");
        return 1;
    }

    public String m2(String str) {
        System.out.println("调用到了 public String m2(String str) ");
        return null;
    }

    private void m3(String str, int n1, char ch) {
        System.out.println("调用到了 private void m3(String str , int n1 , char ch)  ");
    }

    private static void m4() {
        System.out.println("调用到了 private static void m4() ");
    }

}